package database

import (
	"alfred/models"
	"time"
)

// CreateNode 创建Node
func (db *DB) CreateNode(node *models.Node) error {
	node.ID = models.NewID()
	node.CreatedAt = time.Now()
	node.UpdatedAt = time.Now()

	return db.Create(node).Error
}

// GetNode 获取Node
func (db *DB) GetNode(id string) (*models.Node, error) {
	var node models.Node
	err := db.First(&node, "id = ?", id).Error
	if err != nil {
		return nil, err
	}
	return &node, nil
}

// GetNodesByFlowID 根据FlowID获取所有Node
func (db *DB) GetNodesByFlowID(flowID string) ([]*models.Node, error) {
	var nodes []*models.Node
	err := db.Where("flow_id = ?", flowID).Order("\"order\"").Find(&nodes).Error
	return nodes, err
}

// ListNodes 获取所有Node
func (db *DB) ListNodes() ([]*models.Node, error) {
	var nodes []*models.Node
	err := db.Order("created_at DESC").Find(&nodes).Error
	return nodes, err
}

// UpdateNode 更新Node
func (db *DB) UpdateNode(node *models.Node) error {
	node.UpdatedAt = time.Now()
	return db.Save(node).Error
}

// DeleteNode 删除Node
func (db *DB) DeleteNode(id string) error {
	return db.Delete(&models.Node{}, "id = ?", id).Error
}

// GetNodeDefaultScript 获取节点的默认脚本
func (db *DB) GetNodeDefaultScript(nodeID string) (*models.Action, error) {
	var action models.Action
	err := db.Where("node_id = ? AND name = ?", nodeID, "default_script").First(&action).Error
	if err != nil {
		return nil, err
	}
	return &action, nil
}

// SaveNodeDefaultScript 保存或更新节点的默认脚本
func (db *DB) SaveNodeDefaultScript(nodeID, scriptType, content string) error {
	// 先尝试查找现有的默认脚本
	var action models.Action
	err := db.Where("node_id = ? AND name = ?", nodeID, "default_script").First(&action).Error
	
	if err != nil {
		// 如果不存在，创建新的
		action = models.Action{
			ID:        models.NewID(),
			NodeID:    nodeID,
			Name:      "default_script",
			Type:      scriptType,
			Content:   content,
			Order:     1,
			CreatedAt: time.Now(),
			UpdatedAt: time.Now(),
		}
		return db.Create(&action).Error
	} else {
		// 如果存在，更新内容
		action.Type = scriptType
		action.Content = content
		action.UpdatedAt = time.Now()
		return db.Save(&action).Error
	}
}